package com.hup.minicontroller.common.netty;

import io.netty.bootstrap.ServerBootstrap;


/**
 * @author hugan
 * @date 2021/4/24
 */
public class NettyUtil {

    /**
     * 绑定指定端口号[port],如果失败,则尝试绑定[port+n],最多重试 retryTime 次
     *
     * @param port 起始端口号
     * @param retryTime 绑定重试次数,≥0,0表示第一次绑定[port]失败后就马上返回
     * @param callback 结果回调
     */
    public static void bindPort(final ServerBootstrap serverBootstrap, final int port, int retryTime,
            BindCallback callback) {
        serverBootstrap.bind(port).addListener(future -> {
            if (future.isSuccess()) {
                callback.onBindResult(true, port);
            } else {
                if (retryTime <= 0) {
                    callback.onBindResult(false, null);
                } else {
                    bindPort(serverBootstrap, port + 1, retryTime - 1, callback);
                }
            }
        });
    }

    public interface BindCallback {
        /**
         * @param success 是否成功
         * @param boundPort 成功绑定的端口号
         */
        void onBindResult(boolean success, Integer boundPort);
    }


}
